package am.bll;

import am.bll.entity.AccountBook;
import am.bll.entity.AccountItem;
import am.exception.ArgumentNullException;
import am.exception.ArgumentOutOfRangeException;
import am.exception.DatabaseException;
import am.exception.InvalidOperationException;

public interface ItemReader
{
    /**
     * 按照mode指定的模式, 读取与book相关, 序号从from到to的所有item, 所有item组成一个数组返回
     * @param start 指定读取items范围的起始序号(范围包括from)
     * @param end   指定读取item范围的终止序号(范围包括to)
     * @param mode  (先别管这个参数)
     * @param book  需要读取哪个book的item
     * @return 返回一个数组, 包括所有符合条件的item, 若没有符合条件的item, 则返回一个空数组
     * @throws ArgumentNullException book为null
     * @throws ArgumentOutOfRangeException mode不是合法的取值
     * @throws InvalidOperationException book不是一个有效的账本实体 
     * @throws DatabaseException 与数据库连接相关的异常
     */
    AccountItem[] readItems(int start, int end, int mode, AccountBook book) throws ArgumentNullException, ArgumentOutOfRangeException,
            InvalidOperationException, DatabaseException;

    /**
     * 填充指定的item, 通过item的Id来识别
     * @param item 需要填充数据的item, 已经设好了Id
     * @throws ArgumentNullException item为null
     * @throws DatabaseException 与数据库连接相关的异常
     */
    void fillItem(AccountItem item) throws ArgumentNullException, DatabaseException;
}
